package cc.higou.core.tools;

import org.apache.commons.codec.binary.Hex;

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

/**
 * 对用户输入的密码进行加密
 */
public class MD5Utils {

    /**
     * 对密码进行MD5加密（不撒盐）
     *
     * @param password
     * @return
     */
    public static void main(String[] args){

        System.out.println(MD5Utils.str2MD5("123456"));
    }
    public static String str2MD5(String password) {
        StringBuilder sb = new StringBuilder();
        try {
            //获取加密对象
            MessageDigest digest = MessageDigest.getInstance("MD5");
            //加密动作完成
            byte[] bs = digest.digest(password.getBytes());

            //在这里需要把加密后的数据转成字符串，但是不能转成中文字符，需要转成 数字 或者字母
            /*
             * 加密后的数据是-128 到 127 之间的数字，这个数字也不安全。
			 * 取出每个数组的某些二进制位进行某些运算，得到一个新的加密结果
			 *
			 *  0000 0011 0000 0100 0010 0000 0110 0001
			 * &0000 0000 0000 0000 0000 0000 1111 1111
			 * ---------------------------------------------
			 *  0000 0000 0000 0000 0000 0000 0110 0001
			 *
			 *  把取出的数据转成十六进制数
			 */
            for (byte b : bs) {
                //b这里运算的时候自动类型提升，转换成int类型计算，高位不足，补0，所以b转换成了正数
                //b & 255—截取最后8位
                int x = b & 255;
                //如果x小于16不能转成两位的16进制形式数据，补0
                if (x < 16 && x >= 0) {
                    sb.append("0");
                    sb.append(Integer.toHexString(x));
                } else {
                    sb.append(Integer.toHexString(x));
                }
            }
        } catch (Exception e) {
            System.out.println("密码加密失败！！");
        }
        return sb.toString();
    }


    /**
     * 对字符串进行加密（进行撒盐）
     *
     * @param str
     * @return
     */
    public static String encrypt(String str, String yan) {
        String pwd = null;
        try {

            // 如有需要还可以对密码进行加盐
            str = str + yan;

            // 使用md5加密方式
            MessageDigest instance = MessageDigest.getInstance("md5");
            // 开始加密，参数需要将字符串转成字节数组，返回的也是字节数组
            byte[] digest = instance.digest(str.getBytes());

            // 将字节数组转成十六进行字符串
            char[] encodeHex = Hex.encodeHex(digest);
            pwd = new String(encodeHex);

        } catch (NoSuchAlgorithmException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return pwd;
    }


}
